/*
    io使用外部中断
    打开一个定时器做时间戳

    引导码：254 高  8ms 低
    数据码：0-250高，750低； 1-750高，250低
    协议4byte一帧
    addr addr addr data  
*/
#include "RF433.h"

extern xdata u8 uart_tx_buf[];

u16 timestamp = 0;
u16 pre_sp = 0;
u16 pre_ls = 0;


// u8 rf_recv[4] = {0};
u32 rf_tmp = 0;
u32 rf_addr = 0;
xdata u8 rf_value = 0;
xdata u8 rf_value_ls = 0;

bit b_s = 0;
bit b_e = 0;
u8 pos = 0;

void RF433_io_init(void)
{
    P2_MD1 &= ~0x03;//输入上拉
    P2_PU |= 0x10;

    P2_IMK  |=  GPIO_P24_IRQ_MASK(0x1);               //
    P2_TRG1 &= ~GPIO_P24_TRG_SEL(0x3);
    P2_TRG1 |=  GPIO_P24_TRG_SEL(0x0);                // 双边触发

    __SetIRQnIP(P2_IRQn, P2_IQn_CFG);                 // 设置中断优先级
    __EnableIRQ(P2_IRQn);                             // 使能P2中断

}


#if 1
/*
    4个按键小开关
    引导码：370 高  10ms 低
    数据码：0-370高，980低； 1-980高，370低
    协议3byte一帧
    addr addr data  
*/
void RF433_irq_loop(void)
{
    pre_sp = TIM_SP_GET();
    timestamp = pre_sp - pre_ls;
    pre_ls = pre_sp;

    if(b_e){
        return;
    }

    if(RF433_IO){
        // P15 ^= 1;
        //计算低电平时间
        if(b_s){

        }else{
            if(timestamp>TIM_S_MIN && timestamp<TIM_S_MAX){
                b_s = 1;
                rf_tmp = 0;
                pos = 0;

                // P15 ^= 1;

                // uart_tx_buf[0] =  0x0d;
                // uart_tx_buf[1] =  0x0a;

                // uart_tx_buf[2] = (timestamp >> 8) & 0xFF;  
                // uart_tx_buf[3] =  timestamp & 0xFF;        

                // uart_tx_buf[4] = (rf_addr >> 24) & 0xFF;            
                // uart_tx_buf[5] = (rf_addr >> 16) & 0xFF;       

                // uart_tx_buf[6] = (rf_addr  >> 8) & 0xFF;      
                // uart_tx_buf[7] =  rf_addr & 0xFF;           

                // uart_tx_buf[8] = (0  >> 8) & 0xFF; 
                // uart_tx_buf[9] =  0 & 0xFF;;       

                // UART1_STA |= (1 << 2);
                // UART1_DMACON = 0x0A;
            }
        }
    }else{
        //计算高电平时间
        if(b_s){
            // P06 ^= 1;
            if(timestamp<TIM_1_MAX && timestamp>TIM_1_MIN){
                //1
                // P06 ^= 1;
                rf_tmp |= 1;
            }else if(timestamp<TIM_0_MAX && timestamp>TIM_0_MIN){
                // 0
                // P07 ^= 1;
                rf_tmp |= 0;
            }else {
                //err
                b_s = 0;
                // P06 ^= 1;
                return;
            }

            rf_tmp <<= 1;
            pos++;
            if(pos>=24){
                // P07 ^= 1;
                b_e = 1;
                b_s = 0;
                rf_addr = rf_tmp>>8;
                rf_value = (u8)(rf_tmp&0xff);
            }

            // uart_tx_buf[0] =  0x0d;
            // uart_tx_buf[1] =  0x0a;

            // uart_tx_buf[2] = (timestamp >> 8) & 0xFF;  
            // uart_tx_buf[3] =  timestamp & 0xFF;        

            // uart_tx_buf[4] = (rf_addr >> 24) & 0xFF;            
            // uart_tx_buf[5] = (rf_addr >> 16) & 0xFF;       

            // uart_tx_buf[6] = (rf_addr  >> 8) & 0xFF;      
            // uart_tx_buf[7] =  rf_addr & 0xFF;           

            // uart_tx_buf[8] = (0  >> 8) & 0xFF; 
            // uart_tx_buf[9] =  0 & 0xFF;;       

            // UART1_STA |= (1 << 2);
            // UART1_DMACON = 0x0A;
        }
    }
}
#endif


#if 0
/*
    吊扇灯一款遥控 引导码+4byte数据
    引导码：254 高  8ms 低
    数据码：0-250高，750低； 1-750高，250低
    协议4byte一帧
    addr addr addr data  
*/
void RF433_irq_loop(void)
{
    pre_sp = TIM_SP_GET();
    timestamp = pre_sp - pre_ls;
    pre_ls = pre_sp;

    if(b_e){
        return;
    }

    if(RF433_IO){
        //计算低电平时间
        if(b_s){

        }else{
            if(timestamp>TIM_S_MIN && timestamp<TIM_S_MAX){
                b_s = 1;
                rf_tmp = 0;
                pos = 0;
            }
        }
    }else{
        //计算高电平时间
        if(b_s){
            if(timestamp<TIM_1_MAX && timestamp>TIM_1_MIN){
                //1
                rf_tmp |= 1;
            }else if(timestamp<TIM_0_MAX && timestamp>TIM_0_MIN){
                // 0
                rf_tmp |= 0;
            }else {
                //err
                b_s = 0;
                P06 ^= 1;
                return;
            }

            rf_tmp <<= 1;
            pos++;
            if(pos>=32){
                b_e = 1;
                b_s = 0;
                // rf_addr = rf_tmp>>8;
                rf_addr = rf_tmp;
                rf_value = (u8)(rf_tmp&0xff);
            }
        }
    }
}
#endif

/*
    写在外面
*/
// void RF433_sta_loop(void)
// {
//     // u16 debug = 0;

//     if(b_e){
//         b_e = 0;
    
//         P15 ^= 1;

//         // debug = rf_value;
//         // uart_tx_buf[0] =  0x0d;
//         // uart_tx_buf[1] =  0x0a;

//         // uart_tx_buf[2] = (debug >> 8) & 0xFF;  
//         // uart_tx_buf[3] =  debug & 0xFF;        

//         // uart_tx_buf[4] = (0 >> 8) & 0xFF;            
//         // uart_tx_buf[5] =  0 & 0xFF;       

//         // uart_tx_buf[6] = (0  >> 8) & 0xFF;      
//         // uart_tx_buf[7] =  0 & 0xFF;           

//         // uart_tx_buf[8] = (0  >> 8) & 0xFF; 
//         // uart_tx_buf[9] =  0 & 0xFF;;       

//         // UART1_STA |= (1 << 2);
//         // UART1_DMACON = 0x0A;
//     }
// }


